<html>
<head>
<meta charset="utf-8"/>
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
<meta content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,viewport-fit=cover" name="viewport"/>
<meta content="telephone=no" name="format-detection"/>
<style type="text/css">

#watermark {

  position: relative;
  overflow: hidden;
}

#watermark .x {
  position: absolute;
  top: 800;
  left: 400;
  color: #3300ff;
  font-size: 50px;
  pointer-events: none;
  opacity:0.5;
  filter:Alpha(opacity=50);
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
}
    </style>
<style type="text/css">
 html{color:#333;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-rendering:optimizelegibility;font-family:Helvetica Neue,PingFang SC,Verdana,Microsoft Yahei,Hiragino Sans GB,Microsoft Sans Serif,WenQuanYi Micro Hei,sans-serif}html.borderbox *,html.borderbox :after,html.borderbox :before{box-sizing:border-box}article,aside,blockquote,body,button,code,dd,details,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hr,input,legend,li,menu,nav,ol,p,pre,section,td,textarea,th,ul{margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,menu,nav,section{display:block}audio,canvas,video{display:inline-block}body,button,input,select,textarea{font:300 1em/1.8 PingFang SC,Lantinghei SC,Microsoft Yahei,Hiragino Sans GB,Microsoft Sans Serif,WenQuanYi Micro Hei,Helvetica,sans-serif}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}blockquote{position:relative;color:#999;font-weight:400;border-left:1px solid #1abc9c;padding-left:1em;margin:1em 3em 1em 2em}@media only screen and (max-width:640px){blockquote{margin:1em 0}}abbr,acronym{border-bottom:1px dotted;font-variant:normal}abbr{cursor:help}del{text-decoration:line-through}address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:400}ol,ul{list-style:none}caption,th{text-align:left}q:after,q:before{content:""}sub,sup{font-size:75%;line-height:0;position:relative}:root sub,:root sup{vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}a{color:#1abc9c}a:hover{text-decoration:underline}.typo a{border-bottom:1px solid #1abc9c}.typo a:hover{border-bottom-color:#555;color:#555}.typo a:hover,a,ins{text-decoration:none}.typo-u,u{text-decoration:underline}mark{background:#fffdd1;border-bottom:1px solid #ffedce;padding:2px;margin:0 5px}code,pre,pre tt{font-family:Courier,Courier New,monospace}pre{background:hsla(0,0%,97%,.7);border:1px solid #ddd;padding:1em 1.5em;display:block;-webkit-overflow-scrolling:touch}hr{border:none;border-bottom:1px solid #cfcfcf;margin-bottom:.8em;height:10px}.typo-small,figcaption,small{font-size:.9em;color:#888}b,strong{font-weight:700;color:#000}[draggable]{cursor:move}.clearfix:after,.clearfix:before{content:"";display:table}.clearfix:after{clear:both}.clearfix{zoom:1}.textwrap,.textwrap td,.textwrap th{word-wrap:break-word;word-break:break-all}.textwrap-table{table-layout:fixed}.serif{font-family:Palatino,Optima,Georgia,serif}.typo-dl,.typo-form,.typo-hr,.typo-ol,.typo-p,.typo-pre,.typo-table,.typo-ul,.typo dl,.typo form,.typo hr,.typo ol,.typo p,.typo pre,.typo table,.typo ul,blockquote{margin-bottom:1rem}h1,h2,h3,h4,h5,h6{font-family:PingFang SC,Helvetica Neue,Verdana,Microsoft Yahei,Hiragino Sans GB,Microsoft Sans Serif,WenQuanYi Micro Hei,sans-serif;color:#000;line-height:1.35}.typo-h1,.typo-h2,.typo-h3,.typo-h4,.typo-h5,.typo-h6,.typo h1,.typo h2,.typo h3,.typo h4,.typo h5,.typo h6{margin-top:1.2em;margin-bottom:.6em;line-height:1.35}.typo-h1,.typo h1{font-size:2em}.typo-h2,.typo h2{font-size:1.8em}.typo-h3,.typo h3{font-size:1.6em}.typo-h4,.typo h4{font-size:1.4em}.typo-h5,.typo-h6,.typo h5,.typo h6{font-size:1.2em}.typo-ul,.typo ul{margin-left:1.3em;list-style:disc}.typo-ol,.typo ol{list-style:decimal;margin-left:1.9em}.typo-ol ol,.typo-ol ul,.typo-ul ol,.typo-ul ul,.typo li ol,.typo li ul{margin-bottom:.8em;margin-left:2em}.typo-ol ul,.typo-ul ul,.typo li ul{list-style:circle}.typo-table td,.typo-table th,.typo table caption,.typo table td,.typo table th{border:1px solid #ddd;padding:.5em 1em;color:#666}.typo-table th,.typo table th{background:#fbfbfb}.typo-table thead th,.typo table thead th{background:hsla(0,0%,95%,.7)}.typo table caption{border-bottom:none}.typo-input,.typo-textarea{-webkit-appearance:none;border-radius:0}.typo-em,.typo em,caption,legend{color:#000;font-weight:inherit}.typo-em{position:relative}.typo-em:after{position:absolute;top:.65em;left:0;width:100%;overflow:hidden;white-space:nowrap;content:"\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB"}.typo img{max-width:100%}.common-content{font-weight:400;color:#353535;line-height:1.75rem;white-space:normal;word-break:normal;font-size:1rem}.common-content img{display:block;max-width:100%;background-color:#eee}.common-content audio,.common-content video{width:100%;background-color:#eee}.common-content center,.common-content font{margin-top:1rem;display:inline-block}.common-content center{width:100%}.common-content pre{margin-top:1rem;padding-left:0;padding-right:0;position:relative;overflow:hidden}.common-content pre code{font-size:.8rem;font-family:Consolas,Liberation Mono,Menlo,monospace,Courier;display:block;width:100%;box-sizing:border-box;padding-left:1rem;padding-right:1rem;overflow-x:auto}.common-content hr{border:none;margin-top:1.5rem;margin-bottom:1.5rem;border-top:1px solid #f5f5f5;height:1px;background:none}.common-content b,.common-content h1,.common-content h2,.common-content h3,.common-content h4,.common-content h5,.common-content strong{font-weight:700}.common-content h1,.common-content h2{font-size:1.125rem;margin-bottom:.45rem}.common-content h3,.common-content h4,.common-content h5{font-size:1rem;margin-bottom:.45rem}.common-content p{font-weight:400;color:#353535;margin-top:.15rem}.common-content .orange{color:#ff5a05}.common-content .reference{font-size:1rem;color:#888}.custom-rich-content h1{margin-top:0;font-weight:400;font-size:15.25px;border-bottom:1px solid #eee;line-height:2.8}.custom-rich-content li,.custom-rich-content p{font-size:14px;color:#888;line-height:1.6}table.hljs-ln{margin-bottom:0;border-spacing:0;border-collapse:collapse}table.hljs-ln,table.hljs-ln tbody,table.hljs-ln td,table.hljs-ln tr{box-sizing:border-box}table.hljs-ln td{padding:0;border:0}table.hljs-ln td.hljs-ln-numbers{min-width:15px;color:rgba(27,31,35,.3);text-align:right;white-space:nowrap;cursor:pointer;user-select:none}table.hljs-ln td.hljs-ln-code,table.hljs-ln td.hljs-ln-numbers{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;line-height:20px;vertical-align:top}table.hljs-ln td.hljs-ln-code{position:relative;padding-right:10px;padding-left:10px;overflow:visible;color:#24292e;word-wrap:normal;white-space:pre}video::-webkit-media-controls{overflow:hidden!important}video::-webkit-media-controls-enclosure{width:calc(100% + 32px);margin-left:auto}.button-cancel{color:#888;border:1px solid #888;border-radius:3px;margin-right:12px}.button-cancel,.button-primary{-ms-flex-positive:1;flex-grow:1;height:35px;display:inline-block;font-size:15px;text-align:center;line-height:36px}.button-primary{color:#fff;background-color:#ff5a05;border-radius:3px}@font-face{font-family:iconfont;src:url(//at.alicdn.com/t/font_372689_bwwwtosxtzp.eot);src:url(//at.alicdn.com/t/font_372689_bwwwtosxtzp.eot#iefix) format("embedded-opentype"),url(//at.alicdn.com/t/font_372689_bwwwtosxtzp.woff) format("woff"),url(//at.alicdn.com/t/font_372689_bwwwtosxtzp.ttf) format("truetype"),url(//at.alicdn.com/t/font_372689_bwwwtosxtzp.svg#iconfont) format("svg")}@font-face{font-family:player-font;src:url(//at.alicdn.com/t/font_509397_1cyjv4o90qiod2t9.eot);src:url(//at.alicdn.com/t/font_509397_1cyjv4o90qiod2t9.eot#iefix) format("embedded-opentype"),url(//at.alicdn.com/t/font_509397_1cyjv4o90qiod2t9.woff) format("woff"),url(//at.alicdn.com/t/font_509397_1cyjv4o90qiod2t9.ttf) format("truetype"),url(//at.alicdn.com/t/font_509397_1cyjv4o90qiod2t9.svg#player-font) format("svg")}.iconfont{font-family:iconfont!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:.2px;-moz-osx-font-smoothing:grayscale}html{background:#fff;min-height:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{width:100%}body.fixed{overflow:hidden;position:fixed;width:100vw;height:100vh}i{font-style:normal}a{word-wrap:break-word;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:hover{text-decoration:none}.fade-enter-active,.fade-leave-active{transition:opacity .3s}.fade-enter,.fade-leave-to{opacity:0}.MathJax,.MathJax_CHTML,.MathJax_MathContainer,.MathJax_MathML,.MathJax_PHTML,.MathJax_PlainSource,.MathJax_SVG{outline:0}.ios-app-switch .js-audit{display:none}._loading_wrap_{position:fixed;width:100vw;height:100vh;top:50%;left:50%;transform:translate(-50%,-50%);z-index:999}._loading_div_class_,._loading_wrap_{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}._loading_div_class_{word-wrap:break-word;padding:.5rem .75rem;text-align:center;z-index:9999;font-size:.6rem;max-width:60%;color:#fff;border-radius:.25rem;-ms-flex-direction:column;flex-direction:column}._loading_div_class_ .message{color:#353535;font-size:16px;line-height:3}.spinner{animation:circle-rotator 1.4s linear infinite}.spinner *{line-height:0;box-sizing:border-box}@keyframes circle-rotator{0%{transform:rotate(0deg)}to{transform:rotate(270deg)}}.path{stroke-dasharray:187;stroke-dashoffset:0;transform-origin:center;animation:circle-dash 1.4s ease-in-out infinite,circle-colors 5.6s ease-in-out infinite}@keyframes circle-colors{0%{stroke:#ff5a05}to{stroke:#ff5a05}}@keyframes circle-dash{0%{stroke-dashoffset:187}50%{stroke-dashoffset:46.75;transform:rotate(135deg)}to{stroke-dashoffset:187;transform:rotate(450deg)}}.confirm-box-wrapper,.confirm-box-wrapper .mask{position:absolute;top:0;left:0;right:0;bottom:0}.confirm-box-wrapper .mask{background:rgba(0,0,0,.6)}.confirm-box-wrapper .confirm-box{position:fixed;top:50%;left:50%;width:267px;background:#fff;transform:translate(-50%,-50%);border-radius:7px}.confirm-box-wrapper .confirm-box .head{margin:0 18px;font-size:18px;text-align:center;line-height:65px;border-bottom:1px solid #d9d9d9}.confirm-box-wrapper .confirm-box .body{padding:18px;padding-bottom:0;color:#353535;font-size:12.5px;max-height:150px;overflow:auto}.confirm-box-wrapper .confirm-box .foot{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;padding:18px}.confirm-box-wrapper .confirm-box .foot .button-cancel{border:1px solid #d9d9d9}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}




    </style>
<style type="text/css">
        .button-cancel[data-v-87ffcada]{color:#888;border:1px solid #888;border-radius:3px;margin-right:12px}.button-cancel[data-v-87ffcada],.button-primary[data-v-87ffcada]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;height:35px;display:inline-block;font-size:15px;text-align:center;line-height:36px}.button-primary[data-v-87ffcada]{color:#fff;background-color:#ff5a05;border-radius:3px}.pd[data-v-87ffcada]{padding-left:1.375rem;padding-right:1.375rem}.article[data-v-87ffcada]{max-width:70rem;margin:0 auto}.article .article-unavailable[data-v-87ffcada]{color:#fa8919;font-size:15px;font-weight:600;line-height:24px;border-radius:5px;padding:12px;background-color:#f6f7fb;margin-top:20px}.article .article-unavailable .iconfont[data-v-87ffcada]{font-size:12px}.article .main[data-v-87ffcada]{padding:1.25rem 0;margin-bottom:52px}.article-title[data-v-87ffcada]{color:#353535;font-weight:400;line-height:1.65rem;font-size:1.34375rem}.article-info[data-v-87ffcada]{color:#888;font-size:.9375rem;margin-top:1.0625rem}.article-content[data-v-87ffcada]{margin-top:1.0625rem}.article-content.android video[data-v-87ffcada]::-webkit-media-controls-fullscreen-button{display:none}.copyright[data-v-87ffcada]{color:#b2b2b2;padding-bottom:20px;margin-top:20px;font-size:13px}.audio-player[data-v-87ffcada]{width:100%;margin:20px 0}.to-comment[data-v-87ffcada]{overflow:hidden;padding-top:10px;margin-bottom:-30px}.to-comment a.button-primary[data-v-87ffcada]{float:right;height:20px;font-size:12px;line-height:20px;padding:4px 8px;cursor:pointer}.article-comments[data-v-87ffcada]{margin-top:2rem}.article-comments h2[data-v-87ffcada]{text-align:center;color:#888;position:relative;z-index:1;margin-bottom:1rem}.article-comments h2[data-v-87ffcada]:before{border-top:1px dotted #888;content:"";position:absolute;top:56%;left:0;width:100%;z-index:-1}.article-comments h2 span[data-v-87ffcada]{font-size:15.25px;font-weight:400;padding:0 1rem;background:#fff;display:inline-block}.article-sub-bottom[data-v-87ffcada]{z-index:10;cursor:pointer}.switch-btns[data-v-87ffcada]{height:76px;cursor:pointer;padding-top:24px;padding-bottom:24px;border-bottom:10px solid #f6f7fb;position:relative}.switch-btns[data-v-87ffcada]:before{content:" ";height:1px;background:#e8e8e8;position:absolute;top:0;left:0;-webkit-box-sizing:border-box;box-sizing:border-box;left:1.375rem;right:1.375rem}.switch-btns .btn[data-v-87ffcada]{height:38px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.switch-btns .btn .tag[data-v-87ffcada]{-webkit-box-flex:0;-ms-flex:0 0 62px;flex:0 0 62px;text-align:center;color:#888;font-size:14px;border-radius:10px;height:22px;line-height:22px;background:#f6f7fb;font-weight:400}.switch-btns .btn .txt[data-v-87ffcada]{margin-left:10px;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;color:#888;font-size:15px;height:22px;line-height:22px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400}@media (max-width:769px){.article .breadcrumb[data-v-87ffcada]{padding-top:10px;padding-bottom:10px}}





    </style>
<style type="text/css">
        .comment-item{list-style-position:inside;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;margin-bottom:1rem}.comment-item a{border-bottom:none}.comment-item .avatar{width:2.625rem;height:2.625rem;-ms-flex-negative:0;flex-shrink:0;border-radius:50%}.comment-item .info{margin-left:.5rem;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.comment-item .info .hd{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.comment-item .info .hd .username{color:#888;font-size:15.25px;font-weight:400;line-height:1.2}.comment-item .info .hd .control{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.comment-item .info .hd .control .btn-share{color:#888;font-size:.75rem;margin-right:1rem}.comment-item .info .hd .control .btn-praise{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:15.25px;text-decoration:none}.comment-item .info .hd .control .btn-praise i{color:#888;display:inline-block;font-size:.75rem;margin-right:.3rem;margin-top:-.01rem}.comment-item .info .hd .control .btn-praise i.on,.comment-item .info .hd .control .btn-praise span{color:#ff5a05}.comment-item .info .bd{color:#353535;font-size:15.25px;font-weight:400;white-space:normal;word-break:break-all;line-height:1.6}.comment-item .info .time{color:#888;font-size:9px;line-height:1}.comment-item .info .reply .reply-hd{font-size:15.25px}.comment-item .info .reply .reply-hd span{margin-left:-12px;color:#888;font-weight:400}.comment-item .info .reply .reply-hd i{color:#ff5a05;font-size:15.25px}.comment-item .info .reply .reply-content{color:#353535;font-size:15.25px;font-weight:400;white-space:normal;word-break:break-all}.comment-item .info .reply .reply-time{color:#888;font-size:9px}




    </style>
</head>
<body>
<div id="app">
<div class="article" data-v-87ffcada="" id="watermark">

<div class="main main-app" data-v-87ffcada="">
<h1 class="article-title pd" data-v-87ffcada="">
                22讲基于自然语言或者纯文本的设置界面，总有一款适合你
            </h1>
<div class="article-content typo common-content pd" data-v-87ffcada=""><img data-v-87ffcada="" src="https://static001.geekbang.org/resource/image/d3/45/d3087dbe7970ff24b1709fb22304e845.jpg"/>
<div class="" data-v-87ffcada="" id="article-content">
<div class="text">
<p>在上一讲中，我简单介绍了 VS Code 编辑器布局发展的历史，通过对其发展史的一定了解，可以有助于我们更好地掌握快捷键和命令的使用。</p><p>今天的内容，我会分“两步走”。</p><p>第一步，介绍如何在VS Code中寻找和修改配置、快捷键，而且这一部门的内容，我依然会像上一讲一样，以 VS Code 的历史为基础，带你了解 VS Code 的设置和快捷键配置的 UX 是如何一步步演变过来的，以及它们各自的优、缺点是什么。第二步，也就是在文章的最后，我会介绍如何使用文本编辑器，对 VS Code 的快捷键进行高级定制。</p><h2>修改设置</h2><p>相信你早就熟悉了，<span class="orange">VS Code 是以文件和文件夹为核心的，用户的设置、快捷键绑定等，也都是以文件的形式存储在用户的机器上</span>。同时，VS Code 把这一切都开放给用户，也就是说你可以直接对这些文件进行修改。</p><h3>文本编辑器</h3><p>相信通过学习专栏之前的文章，你已经尝试过了修改代码片段（Code Snippet）配置、修改快捷键绑定以及修改个人设置等操作。不过还有些操作我还没有做过介绍。</p><p>VS Code 的最新稳定版里，有两个不同的设置编辑器。下面，让我们先打开命令面板，搜索 “打开设置(JSON)”[Open Settings(JSON)]，然后执行。</p><!-- [[[read_end]]] --><p><img alt="" src="https://static001.geekbang.org/resource/image/29/bd/292a18b9036b4af4d18c4f42a12dbdbd.gif"/></p><center><span class="reference">打开设置(JSON)</span></center><p>此时，我们能看到并排的两个编辑器。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/e7/04/e79ef5983695b87b05b61863ab227a04.png"/></p><center><span class="reference">并排的编辑器</span></center><p>编辑器左侧是 VS Code 支持的各种设置；而右侧，则是我们非常熟悉的 JSON 文本。而且在整个界面的最上方，还有一个输入框，以供我们搜索设置。</p><p>VS Code 早期修改设置的方式有两种。第一种就是在左侧找到设置，然后“复制粘贴”到右侧。第二种是直接在右侧修改，VS Code 为右侧的编辑器提供了自动补全功能。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/d8/67/d8dcf5f24f06685429065469956d2467.gif"/></p><center><span class="reference">修改设置自动补全</span></center><p>在上面的动图中你能看到，我通过输入 fontsize，依靠自动补全找到了 editor.fontSize 这个设置，然后输入到文件中，保存后编辑器的字体大小很快发生了改变。所以通过修改这个设置文件，我们就能够第一时间看到修改设置后的变化。</p><p>当然，我们也可以直接在搜索框里输入设置的名称，找到对应设置后，将鼠标移动到行号附近；这时候我们能看到一个铅笔形状的图标，点击它，就能够看到这个设置允许的值有哪些；选择好我们想要的那个配置后，这个设置就会被自动写到右侧的 JSON 文件里。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/7d/b0/7df336a62f8a62c94836af06636dd7b0.gif"/></p><center><span class="reference">搜索设置并修改</span></center><p>说到设置的搜索，其实最初 VS Code 只会进行单词的模糊匹配，也就是说如果你不小心打错字了，VS Code 就找不到合适的设置了。不过，很快 VS Code 就为这个搜索增加了自然语言的处理。还是使用上面的例子，当我想修改字体的大小时，我可以在搜索框里输入 how to set editor font size。即便我不小心把 font size 打错成了 fontize ，VS Code 也能找到正确的设置项。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/4e/d6/4ec4da4463d47b248cbd32fede4448d6.gif"/></p><center><span class="reference">自然语言搜索</span></center><p>虽然VS Code有很不错的搜索和自动补全，但是我刚使用它的时候，还是挺不适应的。不过这属于 VS Code 设置思路的一部分，就是把细节暴露给用户，让用户也知道设置是如何存储的、格式是怎样的，等等。像我自己在习惯这套搜索方式后，再跑到某些默认打开就是图形化设置界面的编辑器时，反而有点手足无措，我会纠结该如何才能找到我想要的设置。</p><p>当然，做产品不能固步自封。对于陪伴 VS Code 一路走来的用户而言，他们已经非常熟悉和习惯这套理念和操作方式了。可是对于新用户而言，VS Code 基于文本的设置方式，之于他们反而成为了一个障碍。很多新用户会觉得，“我不过是想改一个字体大小，为什么 VS Code 要给我打开两个并排的编辑器，甚至有的时候还需要我自己去修改设置文件？”</p><h3>图形化界面</h3><p>为了解决这个问题 ，VS Code 在最近的几个版本里添加了一个图形化界面。我们可以在命令面板搜索 “打开设置(UI)”并执行。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/18/49/18d6410acb7dfd024f07bc6ddd01e849.gif"/></p><center><span class="reference">设置 UI 界面</span></center><p>使用这样的图形化界面进行设置修改，好处当然也是很明显的：它能尽可能地减少修改配置的难度，并减少我们犯错的可能。</p><p>这里值得注意的是，图形化设置界面是在自然语言搜索之后才出现的，也就是说，虽然我们现在面对的是下拉框、复选框之类的，但我们依然能够使用跟前面一样强大的搜索功能。</p><h3>工作区支持</h3><p>在上面的操作截图里，我们可以看到VS Code 的窗口里并没有打开任何的文件夹。而如果我们打开了一个文件夹，而且这个文件夹下有 .vscode/settings.json 文件的话，此时我们再打开设置界面，则能够看到一些变化。</p><p>比如在基于文本的设置界面里，我们可以在右侧的 JSON 编辑器里看到 “用户设置”和“工作区设置”两个选项。如果我们修改工作区设置的话，它会立刻被保存到 .vscode/settings.json 里。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/a7/6d/a7a2aa4986d38919c1c800d513491a6d.png"/></p><center><span class="reference">工作区设置</span></center><p>而在图形化设置界面里，我们也同样可以在搜索框下进行个人和工作区设置的选择。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/20/11/2080389388a29be11182c9c0a8996d11.png"/></p><center><span class="reference">图形化设置界面：工作区设置</span></center><h2>修改快捷键</h2><p>介绍完设置，我们再来说说快捷键绑定。下面我主要从图形化界面和文本界面两个角度来阐述。</p><h3>图形化界面</h3><p>在专栏的最开始，我就介绍了如何使用快捷键界面去搜索和修改界面——在命令面板里“打开键盘快捷方式”（Open Keyboard Shortcuts）并执行。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/0a/a2/0a02ac588fd38d72a6e9aa8ab1b7daa2.png"/></p><center><span class="reference">快捷键修改界面</span></center><p>修改某个命令的快捷键也很简单，搜索并找到命令后，双击命令项就可以对快捷键进行修改了。如果你不熟悉的话，可以先复习一下<a href="https://time.geekbang.org/column/article/40098">第4讲 “如何做到双手不离键盘？”</a> 的内容。</p><p>不过，这里我要介绍一个 <span class="orange">VS Code 本月新增的功能</span>（注意你需要更新到最新版本的 VS Code）。我们有的时候发现某个快捷键执行的命令不是我们想要的，这说明可能某个插件或者我们自己的配置有问题。要想看看某个快捷键究竟绑定在哪个命令上，我们可以在快捷键界面的搜索框里输入这个快捷键对应的字符。比如我可以在搜索框里输入 “cmd+s” 来看看它是不是绑定到了文本保存这个命令上。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/2d/f6/2d6779a0083b889ff1ed263e6938cdf6.gif"/></p><center><span class="reference">搜索 cmd+s</span></center><p>不过要手动输入 “cmd+s” 还是很麻烦的，更不要说如果我们要输入的是 “cmd+option+shift+s” 之类的复杂快捷键了。在最新版本里，这个搜索框的最右侧，多出一个小按钮。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/f3/20/f3868eaf7f87a7c67727c26da34b5920.png"/></p><p><span class="reference">输入框功能按钮</span></p><p>这个按钮的作用是<strong>键盘录制</strong>。如果我们点击这个按钮，激活键盘录制模式，此时，当我们在这个搜索框里按下键盘，键盘按钮所对应的快捷键文本就会被输入到搜索框中。所以有了这个按钮，即便搜索再复杂的快捷键，也不怕麻烦了。（第二个按钮则是对结果进行排序，老版本也有。）</p><p><img alt="" src="https://static001.geekbang.org/resource/image/4a/f2/4af074d2e507f375718337af7e025af2.gif"/></p><center><span class="reference">键盘录制</span></center><h3>文本界面</h3><p>虽然我在专栏里一直都是介绍使用图形化的快捷键修改界面，但是 VS Code 快捷键修改，在最开始的时候，跟编辑器设置界面是一样的，也是基于文本编辑器的。你可以在快捷键界面的搜索框下，看到一行提示“高级自定义请打开和编辑器 keybindings.json”。你不妨点击这个链接，效果如下图：</p><p><img alt="" src="https://static001.geekbang.org/resource/image/8d/4b/8d2a9c0f471bcaa95734cc31a5e0164b.png"/></p><center><span class="reference">快捷键修改图形界面</span></center><p>如果你要<strong>搜索</strong>某个命令或者快捷键，可以在左侧编辑器唤出搜索框；而<strong>添加</strong>快捷键，则是使用右下角的 “定义按键绑定” 按钮。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/15/c3/15e1df707b69736cba1b11b166f2b8c3.gif"/></p><center><span class="reference">搜索和定义快捷键绑定</span></center><p>你是不是会觉得，虽然我们更好地理解了快捷键设置都是绑定在 keybindings.json 这个文件里的，格式也是 JSON，但是好像这个文本编辑器完全比不上图形化的界面啊？</p><p>别着急，接下来咱们就要聊一聊今天文章里技术含量最高的知识点了。</p><h2>快捷键高级定制</h2><p>如果你按照上面的介绍，点击了 “定义按键绑定” 的蓝色按钮的话，你会看到右侧的文本编辑器中，插入了一段文本。</p><p><img alt="" src="https://static001.geekbang.org/resource/image/a6/4f/a60882c39f92939feb26cbedd3cf524f.png"/></p><center><span class="reference">快捷键文本编辑器</span></center><p>如果你是跟着专栏内容一章一章走过来的话，你一定立刻就看出来了，这段插入的文本，是一个代码片段（code  snippet，不熟悉的话，可以复习专栏<a href="https://time.geekbang.org/column/article/40896">第 10 讲 “拒绝重复，你的代码百宝箱：如何书写code snippet？”</a>）。</p><pre><code>{
  "key": "cmd+enter",
  "command": "command",
  "when": "editorTextFocus"
}
</code></pre><h3>Command</h3><p>这段代码片段，有两个 Tab Stop。第一个 Tab Stop 停留在 ”command” 这个属性的值中，它的意思是，我们想要为哪个命令指定特殊的快捷键。这个 command 在左侧的编辑器中也可以查询得到。</p><h3>When</h3><p>而第二个 Tab Stop，则是在 “when” 这个属性的值中。这个 “when” 是什么意思呢？顾名思义，它说的是在什么情况下这个快捷键绑定能够生效。此时 “when” 的值已经有一个占位符 （placeholder）了，叫做“<strong>editorTextFocus</strong>”，它代表着光标聚焦在代码编辑器的文本上。如果光标在编辑器的文本上时，那么 “editorTextFocus” 就是 true，那么这个“when”的条件就生效了，这则快捷键绑定就会生效。而假如光标处在集成终端里，此时 “editorTextFocus”就是 false 了，这个 “when” 就不生效了，同样也就不会绑定这个快捷键了。</p><p>在 “when” 条件里，除了editorTextFocus外，我们还有非常多的值可以使用，并且加以组合。比如集成终端对应的是 terminalFocus，资源管理器对应的是 filesExplorerFocus 。除此之外，你也可以<a href="https://code.visualstudio.com/docs/getstarted/keybindings#_when-clause-contexts">利用VS Code的文档去查询全部可以使用的值</a>。</p><p>而在书写 “when” 条件时，VS Code 还支持几个基础的操作符。这样我们就能够书写相对复杂的条件语句了。</p><ol>
<li>
<p>! 取反。比如我们希望当光标不在编辑器里时，绑定一个快捷键，那么我们可以使用  !editorFocus，使用 ！进行取反。</p>
</li>
<li>
<p>== 等于。when 条件值除了是 boolean 以外，也可以是字符串。比如 resourceExtname 对应的是打开的文件的后缀名，如果我们想给 js 文件绑定一个快捷键，我们可以用 “resourceExtname == .js”。</p>
</li>
<li>
<p>&amp;&amp; And 操作符。我们可以将多个条件值组合使用，比如我希望当光标在编辑器里且编辑器里正在编辑的是 js 文件，那么我可以用 “editorFocus &amp;&amp; resourceExtname == .js”。</p>
</li>
<li>
<p>=~ 正则表达式。还是使用上面的例子，如果我要检测文件后缀是不是 js，我也可以写成 “resourceExtname =~ /js/”，通过正则表达式来进行判断。</p>
</li>
</ol><p>你可以试着从简单的<code>&amp;&amp;</code>和<code>==</code>等操作符开始，然后再使用正则表达式，进行更复杂的条件判断。</p><h3>Key</h3><p>我们回过头来再看下这段快捷键绑定的代码：</p><pre><code>{
  "key": "cmd+enter",
  "command": "command",
  "when": "editorTextFocus"
}
</code></pre><p>在这个 JSON 对象里第一个键是 key，也就是你将要使用的快捷键。如果你是使用“定义按键绑定”按钮来生成的，那么 VS Code 会根据你的键盘布局来自动生成这个文本。你当然也可以自行修改，不过我不建议这么做，因为 VS Code 为了适应各种不同的键盘布局，在 key 这个值上还是有很多特殊要求的。</p><p>比如说，你想给某个快捷键绑定上“cmd+\”这个键，VS Code 会自动为你输入 “cmd+[Backslash]”。因为不同键盘上的 “\” 键的布局可能会不同，VS Code 使用统一的 [Backslash]来进行指代。你当然也可以输入 “cmd+\”  （请注意，这里我使用了两个 \，因为我们在 JSON 里需要进行转义 escape），但是如果你把 keybindings.json 分享给其他人的话，是不一定能够保证生效的。</p><p>如果你对如何手动输入 key 很感兴趣，可以参考<a href="https://code.visualstudio.com/docs/getstarted/keybindings#_keyboard-layouts">VS Code 中相关的文档</a>，该文档里介绍了 VS Code 针对不同键盘布局 （keyboard layout）所做的特殊处理。</p><h3>删除快捷键</h3><p>我们在快捷键的图形界面里也介绍过，可以使用上下文菜单删除某个快捷键绑定。不过，删除操作在 keybindings.json 里是如何体现的呢？其实非常简单，假如说我们不想使用 “cmd+s” 来保存文本，首先我们找到 “cmd+s” 对应的快捷键绑定设置，</p><pre><code>{
  "key": "cmd+s",
  "command": "workbench.action.files.save"
}
</code></pre><p>然后我们只需在右侧的 keybinding.json 里，添加一条新的快捷键绑定，如下：</p><pre><code>{
  "key": "cmd+s",
  "command": "-workbench.action.files.save"
}
</code></pre><p>在这条新的快捷键绑定里，“command” 的值在开头添加了一个 - 减号。这个减号就告诉 VS Code 我们希望给这个命令解除快捷键绑定。</p><p>对了，在解绑快捷键时，我们也可以使用 “when” 条件。这样的话，我们就能够做到只在特定情况下解除某个快捷键的绑定。</p><h2>小结</h2><p>以上就是我们今天的全部内容了。我们介绍了 VS Code 的设置和快捷键绑定界面的演变过程，相信你已经非常熟悉 VS Code 是如何保存和处理这些配置文件的了。同时，我们还介绍了如何对快捷键绑定做一些相对复杂的定制，在后面的文章里，我还会介绍如何将这些快捷键绑定以插件的形式更好地分享给其他人。</p><p>在构思这篇文章的时候，我还在想是不是要把工作区这个部分我没有涉及到的工作区设置或者快捷键全部介绍一遍。但是授人鱼不如授人以渔，相信你了解了如何搜索、修改和定制 VS Code 的设置和快捷键后，你能够自己寻找到想要的答案。</p><hr/><p><img alt="" src="https://static001.geekbang.org/resource/image/92/06/92862660523add24b3168f22954fa506.jpg"/></p>
</div>
</div>
</div>
<div class="article-comments pd" data-v-87ffcada=""><h2 data-v-87ffcada=""><span data-v-87ffcada="">精选留言</span></h2>
<ul data-v-87ffcada="">
</ul>
</div>
</div>
</div>
</div>
</body>
</html>